using UnityEngine;
using DLib.BehaviorTree;
using DLib.BehaviorTree.Tasks;

/// <summary>
/// 行为树构建器演示脚本
/// 展示如何使用BehaviorTreeBuilder创建复杂的行为树
/// 演示链式调用和便捷方法的使用
/// </summary>
public class BuilderDemo : MonoBehaviour
{
    /// <summary>行为树组件引用</summary>
    public BehaviorTree behaviorTree;

    /// <summary>
    /// Unity Start方法
    /// 初始化行为树并使用构建器创建演示树
    /// </summary>
    void Start()
    {
        // 创建行为树实例
        if (behaviorTree == null)
        {
            behaviorTree = new BehaviorTree();
        }

        // 使用构建器创建行为树
        CreateTreeWithBuilder();
    }

    /// <summary>
    /// Unity Update方法
    /// 手动更新行为树
    /// </summary>
    void Update()
    {
        // 手动更新行为树
        if (behaviorTree.isRunning && behaviorTree.root != null)
        {
            NodeState state = behaviorTree.root.Evaluate();
            
            if (state != NodeState.Running)
            {
                behaviorTree.isRunning = false;
                Debug.Log($"Builder Demo Behavior Tree completed with state: {state}");
            }
        }
    }

    /// <summary>
    /// 使用构建器创建复杂的行为树
    /// 演示链式调用和嵌套结构
    /// </summary>
    void CreateTreeWithBuilder()
    {
        Debug.Log("使用构建器创建行为树...");

        // 使用构建器创建复杂的行为树
        // 链式调用方式，代码更清晰易读
        Node rootNode = new BehaviorTreeBuilder()
            .Selector()  // 根选择器
                .Sequence()  // 第一个分支：检查敌人
                    .Log("检查是否有敌人")
                    .Wait(0.5f)
                    .Random(0.3f) // 30%概率发现敌人
                    .Log("发现敌人，开始攻击")
                    .Wait(1f)
                    .Log("攻击完成")
                .End()  // 结束序列
                .Sequence()  // 第二个分支：检查休息
                    .Log("检查是否需要休息")
                    .Wait(0.5f)
                    .Random(0.7f) // 70%概率需要休息
                    .Log("开始休息")
                    .Wait(2f)
                    .Log("休息完成")
                .End()  // 结束序列
                .Repeater(3)  // 第三个分支：重复巡逻
                    .Sequence()
                        .Log("巡逻中...")
                        .Wait(1f)
                    .End()
                .End()  // 结束重复器
            .End()  // 结束选择器
            .Build();  // 构建完成

        // 设置根节点
        behaviorTree.SetRoot(rootNode);
    }

    /// <summary>
    /// Unity OnGUI方法
    /// 显示控制界面
    /// </summary>
    void OnGUI()
    {
        // 创建GUI区域
        GUILayout.BeginArea(new Rect(10, 10, 300, 150));
        
        // 显示标题
        GUILayout.Label("构建器演示", GUI.skin.box);
        
        // 显示状态信息
        GUILayout.Label($"状态: {behaviorTree.GetCurrentState()}");
        GUILayout.Label($"运行中: {behaviorTree.isRunning}");
        
        // 重新开始按钮
        if (GUILayout.Button("重新开始"))
        {
            behaviorTree.ResetTree();
        }
        
        // 使用便捷方法按钮
        if (GUILayout.Button("使用便捷方法"))
        {
            CreateTreeWithConvenienceMethods();
        }
        
        // 结束GUI区域
        GUILayout.EndArea();
    }

    /// <summary>
    /// 使用便捷方法创建行为树
    /// 演示静态便捷方法的使用
    /// </summary>
    void CreateTreeWithConvenienceMethods()
    {
        Debug.Log("使用便捷方法创建行为树...");

        // 使用便捷方法创建行为树
        // 这种方式更简洁，适合简单的行为树
        Node rootNode = BehaviorTreeBuilder.CreateSelector(
            // 第一个分支：测试1
            BehaviorTreeBuilder.CreateSequence(
                new LogTask("便捷方法测试1"),
                new WaitTask(1f),
                new LogTask("便捷方法测试1完成")
            ),
            // 第二个分支：测试2
            BehaviorTreeBuilder.CreateSequence(
                new LogTask("便捷方法测试2"),
                new WaitTask(1f),
                new LogTask("便捷方法测试2完成")
            ),
            // 第三个分支：重复测试
            BehaviorTreeBuilder.CreateRepeater(
                new LogTask("重复测试"),
                2
            )
        );

        // 设置根节点
        behaviorTree.SetRoot(rootNode);
    }
} 